#include <iostream>
using namespace std;

class A {
public:
    A(int a) : mVal(a) {
        printf("A(), mVal=%d\n", mVal);
    }
    ~A() {
        printf("~A(), mVal=%d\n", mVal);
    }

private:
    int mVal;
};

A &f() {
    A a = A(10);
    return a;  // a是局部变量，是左值。该值在离开此函数时即被销毁，绑定给A&并不会延长它的生命周期
}

int main() {
    A &ref = f(); // 此处的ref指向一个非法值
    A(0);  // 右值。生命周期只有该行。被创建后立即被析构
    A &&ref1 = A(1);  // 将右值绑定给右值引用ref1，其生命周期被延长至与ref1相同
    A &&ref2 = A(2);  // 将右值绑定给右值引用ref2，其生命周期被延长至与ref2相同
} // 离开函数作用域，依次销毁ref2、ref1